#!/usr/bin/python
# -*- coding: utf-8 -*-

'''
@summary: Staticz é uma aplicaçao que le o ficheiro xls fornecido e 
insere toda a informaçao numa base de dados. Através de uma interface
gráfica, qualquer utilizador pode aceder às estatisticas facultadas.
Desenvolvida no ambito da disciplina de Linguagens de Programaçao do 
curso de Engenharia Informática da ESTIG - BEJA
        
@requires: tabela_dados.py, DataBase.py, DataManager.py, ExportFile.py e 
Graficos.py
           
@development environment:
Maquina Virtual com Debian7.1
Python 2.7
wxGlade

@author: Adriano Leal - 11951, Gonçalo Ferreira - 11958
@version: 2.4
@date: 04/12/2013 
'''

#~ import DataBase # Módulo processar_dados.py
import DataManager
import Graficos
import ExportFile 
import tabela_dados
import wx
from time import gmtime, strftime


data = DataManager.Datamanager()
#------------------------------------------------

class MyDialog(wx.Dialog):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyDialog.__init__
        kwds["style"] = wx.DEFAULT_DIALOG_STYLE
        wx.Dialog.__init__(self, *args, **kwds)
        self.label_1 = wx.StaticText(self, -1, "\nSTATICZ")
        self.label_2 = wx.StaticText(self, -1, "\nv2.6beta")
        self.label_3 = wx.StaticText(self, -1, u"\n\n\n     ::: Adriano Leal :::\n   ::: Gonçalo Ferreira :::")
        self.label_4 = wx.StaticText(self, -1, "\n\nTodos os direitos encontram-se reservados")
        self.grid_sizer_1_staticbox = wx.StaticBox(self, -1, "")

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: MyDialog.__set_properties
        self.SetTitle("Acerca")
        self.SetSize((400, 220))
        self.label_1.SetFont(wx.Font(20, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, ""))
        self.label_2.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, 1, ""))
        self.label_3.SetFont(wx.Font(10, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, ""))
        self.label_4.SetFont(wx.Font(7, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyDialog.__do_layout
        self.grid_sizer_1_staticbox.Lower()
        grid_sizer_1 = wx.StaticBoxSizer(self.grid_sizer_1_staticbox, wx.VERTICAL)
        grid_sizer_1.Add(self.label_1, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
        grid_sizer_1.Add(self.label_2, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
        grid_sizer_1.Add(self.label_3, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
        grid_sizer_1.Add(self.label_4, 0, wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_VERTICAL, 0)
        self.SetSizer(grid_sizer_1)
        self.Layout()
        # end wxGlade
        
#------------------------------------------------

class MyFrame(wx.Frame):
    '''
    Janela principal da aplicaçao
    Código gerado através da aplicaçao wxGlade
    '''
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size = (800, 600))

        self.create_menus()

        self.CreateStatusBar(2)
        self.SetStatusText("", 0)
        self.SetStatusText(strftime("%a, %d %b %Y ", gmtime()), 1)
        
        #~ datamngr = DataManager()


    def create_menus(self):
        '''
        Cria os menus, submenus e eventos
        '''
        # Menu Bar
        self.barra_menus = wx.MenuBar()
        wxglade_menubar = wx.Menu()
        wxglade_menubar.Append(11, "Sair", "Sair", wx.ITEM_NORMAL)
        self.barra_menus.Append(wxglade_menubar, "Ficheiro")
        wxglade_menubar = wx.Menu()
        self.barra_menus.Append(wxglade_menubar, "")
        wxglade_menubar = wx.Menu()
        wxglade_menubar.Append(21, "Exportar para CSV", "Gravar ficheiro CSV com consultas", wx.ITEM_NORMAL)
        self.barra_menus.Append(wxglade_menubar, "Editar")
        wxglade_menubar = wx.Menu()
        self.barra_menus.Append(wxglade_menubar, "")
        wxglade_menubar = wx.Menu()
        wxglade_graficos_distrito = wx.Menu()
        wxglade_consultas = wx.Menu()
        wxglade_graficos = wx.Menu()
        wxglade_graficos_distrito.Append(3111, "Aveiro", "Gráfico do Distrito de Aveiro", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(3112, "Beja", "Gráfico do Distrito de Beja", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(3113, "Braga", "Gráfico do Distrito de Braga", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(3114, "Bragança", "Gráfico do Distrito de Bragança", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(3115, "Castelo Branco", "Gráfico do Distrito de Castelo Branco", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(3116, "Coimbra", "Gráfico do Distrito de Coimbra", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(3117, "Évora", "Gráfico do Distrito de Évora", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(3118, "Faro", "Gráfico do Distrito de Faro", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(3119, "Guarda", "Gráfico do Distrito de Guarda", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(31110, "Leiria", "Gráfico do Distrito de Leiria", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(31111, "Lisboa", "Gráfico do Distrito de Lisboa", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(31112, "Portalegre", "Gráfico do Distrito de Portalegre", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(31113, "Porto", "Gráfico do Distrito de Porto", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(31114, "Santarém", "Gráfico do Distrito de Santarém", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(31115, "Setúbal", "Gráfico do Distrito de Setúbal", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(31116, "Viana do Castelo", "Gráfico do Distrito de Viana do Castelo", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(31117, "Vila Real", "Gráfico do Distrito de Vila Real", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(31118, "Viseu", "Gráfico do Distrito de Viseu", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(31119, "Açores", "Gráfico do Distrito de Açores", wx.ITEM_NORMAL)
        wxglade_graficos_distrito.Append(31120, "Madeira", "Gráfico do Distrito de Madeira", wx.ITEM_NORMAL)
        wxglade_consultas.Append(321, "Colocados por Instituiçao", "Alunos colocados por instituiçao", wx.ITEM_NORMAL)
        wxglade_consultas.Append(322, "Colocados por Distrito", "Alunos colocados por distrito", wx.ITEM_NORMAL)
        wxglade_consultas.Append(323, "Vagas por Instituiçao", "Alunos colocados por instituiçao", wx.ITEM_NORMAL)
        wxglade_consultas.Append(324, "Vagas por Distrito", "Alunos colocados por distrito", wx.ITEM_NORMAL)
        wxglade_consultas.Append(325, "Porcentagem colocados", "Porcentagem de alunos colocados face ao total nacional", wx.ITEM_NORMAL)
        wxglade_consultas.Append(326, "Pormilagem colocados", "Pormilagem de alunos colocados por distrito", wx.ITEM_NORMAL)
        wxglade_menubar.AppendMenu(31, u"Gráficos", wxglade_graficos, "Visualizar Gráficos")
        wxglade_menubar.AppendMenu(32, u"Consultas", wxglade_consultas, "Visualizar Consultas")
        wxglade_graficos.AppendMenu(311, u"Por Distrito", wxglade_graficos_distrito, "Visualizar Gráficos por Distrito")
        wxglade_graficos.Append(312, "Pormilagem colocados", "Gráfico com pormilagem de alunos colocados", wx.ITEM_NORMAL)
        wxglade_graficos.Append(313, "Porcentagem colocados", "Gráfico com porcentagem de alunos colocados", wx.ITEM_NORMAL)
        wxglade_graficos.Append(314, "Colocados por distrito", "Gráfico com análise de colocados em todos os distritos", wx.ITEM_NORMAL)
        self.barra_menus.Append(wxglade_menubar, "Estatisticas")
        wxglade_menubar = wx.Menu()
        self.barra_menus.Append(wxglade_menubar, "")
        wxglade_menubar = wx.Menu()
        wxglade_menubar.Append(41, "Acerca", "Informaçao acerca do Staticz", wx.ITEM_NORMAL)
        self.barra_menus.Append(wxglade_menubar, "Ajuda")
        self.SetMenuBar(self.barra_menus)

        self.Bind(wx.EVT_MENU, self.evento_acerca, id = 41)
        self.Bind(wx.EVT_MENU, self.evento_grafico_pormilagem, id = 312)
        self.Bind(wx.EVT_MENU, self.evento_grafico_porcentagem, id = 313)
        self.Bind(wx.EVT_MENU, self.evento_sair, id = 11)
        self.Bind(wx.EVT_MENU, self.evento_grafico_colocados, id = 314)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_aveiro, id = 3111)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_beja, id = 3112)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_braga, id = 3113)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_braganca, id = 3114)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_cstbranco, id = 3115)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_coimbra, id = 3116)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_evora, id = 3117)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_faro, id = 3118)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_guarda, id = 3119)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_leiria, id = 31110)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_lisboa, id = 31111)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_portalegre, id = 31112)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_porto, id = 31113)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_santarem, id = 31114)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_setubal, id = 31115)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_vcastelo, id = 31116)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_vilareal, id = 31117)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_viseu, id = 31118)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_acores, id = 31119)
        self.Bind(wx.EVT_MENU, self.evento_grafico_distrito_madeira, id = 31120)
        self.Bind(wx.EVT_MENU, self.evento_exportar_csv, id = 21)
        
        #self.Bind(wx.EVT_MENU, self.evento_consulta_pormilagem, id = 326)


    def evento_sair(self, event):
        '''
        Evento inerente ao submenu Sair -- Ficheiro - Sair
        Apresenta janela com confirmaçao de escolha
        '''
        self.sair()


    def sair(self):
        '''
        Caixa de diálogo a solicitar confirmaçao da opçao
        '''
        ret = wx.MessageBox('Deseja sair do Staticz ?',
                            'Sair',
                            wx.YES_NO | wx.CENTRE | wx.NO_DEFAULT, self)
        if ret == wx.YES:
            exit(0)
        pass
        
     
    def evento_acerca(self, event):
        '''
        Apresenta janela Acerca
        '''
        dialog = MyDialog()
        dialog.ShowModal()
        dialog.Destroy()
        
        
    def evento_grafico_pormilagem(self, event):
        '''
        Apresenta o grafico pormilagem        
        '''   
        data.colocados_instituicao()
        data.colocados_distrito()
        data.nome_distrito()
        data.pormilagem_valor()
        
        Graficos.permilagem_distrito()
        data.limpa_lista()

    def evento_grafico_porcentagem(self, event):
        '''
        Apresenta o grafico porcentagem        
        '''   
        data.colocados_instituicao()
        data.porcentagem_valor()
        Graficos.porcentagem_instituicao()
        data.limpa_lista()


    def evento_grafico_colocados(self, event):
        '''
        Apresenta o grafico colocados        
        '''
        data.colocados_distrito()   
        data.vagas_total()
        data.nome_distrito()
        Graficos.colocados_vagas_distrito() 
        data.limpa_lista()
        
    def evento_grafico_distrito_aveiro(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('AVEIRO')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('AVEIRO')
        data.limpa_lista()
        
    def evento_grafico_distrito_beja(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('BEJA')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('BEJA')
        data.limpa_lista()
        
    def evento_grafico_distrito_braga(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('BRAGA')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('BRAGA')
        data.limpa_lista()
        
    def evento_grafico_distrito_braganca(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('BRAGANÇA')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito(u'BRAGANÇA')
        data.limpa_lista()
        
    def evento_grafico_distrito_cstbranco(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('CASTELO BRANCO')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('CASTELO BRANCO')
        data.limpa_lista()
        
    def evento_grafico_distrito_coimbra(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('COIMBRA')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('COIMBRA')
        data.limpa_lista()
        
    def evento_grafico_distrito_evora(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('EVORA')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito(u'ÉVORA')
        data.limpa_lista()
        
    def evento_grafico_distrito_faro(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('FARO')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('FARO')
        data.limpa_lista()
        
    def evento_grafico_distrito_guarda(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('GUARDA')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('GUARDA')
        data.limpa_lista()
        
    def evento_grafico_distrito_leiria(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('LEIRIA')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('LEIRIA')
        data.limpa_lista()
        
    def evento_grafico_distrito_lisboa(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('LISBOA')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('LISBOA')
        data.limpa_lista()
        
    def evento_grafico_distrito_portalegre(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('PORTALEGRE')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('PORTALEGRE')
        data.limpa_lista()
        
    def evento_grafico_distrito_porto(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('PORTO')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('PORTO')
        data.limpa_lista()
        
    def evento_grafico_distrito_santarem(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito(u'SANTARÉM')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito(u'SANTARÉM')
        data.limpa_lista()
        
    def evento_grafico_distrito_setubal(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito(u'SETÚBAL')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito(u'SETÚBAL')
        data.limpa_lista()
        
    def evento_grafico_distrito_vcastelo(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('VIANA DO CASTELO')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('VIANA DO CASTELO')
        data.limpa_lista()
        
    def evento_grafico_distrito_vilareal(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('VILA REAL')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('VILA REAL')
        data.limpa_lista()
        
    def evento_grafico_distrito_viseu(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('VISEU')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('VISEU')
        data.limpa_lista()
        
    def evento_grafico_distrito_acores(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito(u'AÇORES')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito(u'AÇORES')
        data.limpa_lista()
        
    def evento_grafico_distrito_madeira(self, event):
        '''
        Apresenta em gráfico os alunos colocados nas instituiçoes
        do distrito escolhido        
        '''
        data.colocados_distrito()   
        data.colocados_nome_distrito('MADEIRA')
        data.nome_distrito()
        Graficos.colocados_instituicao_distrito('MADEIRA')
        data.limpa_lista()

    def evento_exportar_csv(self, event):
        '''
        Exporta as consultas para um ficheiro csv 
        '''
        data.exportar_ficheiro()
        

    #~ def evento_consulta_pormilagem(self, event):
        #~ '''
        #~ Processa o evento do menu "Docentes a leccionar em mais que um estabelecimento"
        #~ Mostra uma frame com o resultado de uma pesquisa à base de dados numa grelha.
        #~ '''
        #~ frame = tabela_dados.TableFrame(data.colocados_dist,
                                  #~ 'Pormilagem de colocados por distrito')
        #~ frame.Show(True)


class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'Staticz')
        frame.Show(True)
        frame.Centre()
        return True
    
app = MyApp(0)
app.MainLoop()
